home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d1 / eddtv4.arc / EDDTV400.ASM < prev    next >
Assembly Source File  |  1988-03-28  |  39KB  |  936 lines

  1.          .XLIST
  2.          PAGE  80,120
  3.          PAGE
  4.          TITLE OèÄ EDDT - EXTENDED DRIVE DESCRIPTON TABLESö
  5.          .LIST
  6.          .286                     ; ENABLE 80286 INSTRUCTIONS
  7.          SUBTTL ROUTINE TO ALLOW EXTENDED HARD DRIVE DESCRIPTIONS
  8.          COMMENT *
  9.  
  10.          EDDT VERSION 4.00
  11.  
  12.          Copyright 1987,1988 Don Gentry
  13.  
  14.          A limited license is granted to all users of this program,
  15.          to make copies of this program, and distribute them to
  16.          other users, on the following conditions:
  17.  
  18.          1. The notice on this page is not to be removed or altered
  19.  
  20.          2. No fee is to be charged for copying or distributing
  21.             the program.
  22.  
  23.          3. No warranty of any kind is offered. This program is offered
  24.             on an "AS IS" basis. Each user should verify that it meets
  25.             his needs and verify correct operation.
  26.  
  27.          4. No further restrictions on redristribution of any kind may
  28.             be required. This includes, but is not limited to,
  29.             COMPUSERVE or other program distribution services,
  30.             by electronic or other means.
  31.  
  32.          FOR HELP OR SUGGESTIONS WRITE:
  33.  
  34.          DON GENTRY
  35.          183 BELLEGROVE CIRCLE
  36.          BRANDON, MS  39042
  37.  
  38.          OR CALL (601) 992-0577
  39.  
  40.                                                                 *
  41.          IF1
  42.          PAGE
  43.          INCLUDE EDDT_MAC.LIB
  44.          ENDIF
  45.          PAGE
  46. PAUSE    MACRO                    ;                             03/12/88
  47. ;;       NO PAUSE TIME IN  EDDT VERSION 4.00                    03/12/88
  48.          ENDM                                                   03/12/88
  49. PAGE_0   SEGMENT AT 0             ; DEFINE LOW MEMORY
  50.          ORG   041H*4             ; SKIP TO DRIVE 0 VECTOR
  51. ED_DRIV0 DD    ?                  ; DRIVE 0 PARAMETER VECTOR
  52.          ORG   ED_DRIV0           ; REDEFINE VECTOR
  53. ED_D0OFF DW    ?                  ; DRIVE 0 VECTOR OFFSET
  54. ED_D0SEG DW    ?                  ; DRIVE 0 VECTOR SEGMENT
  55.          ORG   046H*4             ; SKIP TO DRIVE 0 VECTOR
  56. ED_DRIV1 DD    ?                  ; DRIVE 1 PARAMETER VECTOR
  57.          ORG   ED_DRIV1           ; REDEFINE VECTOR
  58. ED_D1OFF DW    ?                  ; DRIVE 1 VECTOR OFFSET
  59. ED_D1SEG DW    ?                  ; DRIVE 1 VECTOR SEGMENT
  60.          ORG   078H*4             ; ORG TO UNUSED RUPT VECTOR
  61. ED_WORKA DB    4 DUP(?)           ; WORK AREA
  62. PAGE_0   ENDS                     ; END OF SEGMENT
  63.          PAGE
  64. ;-----------------------------------------------------------------------
  65. ;             ROM BIOS DATA AREAS
  66. ;-----------------------------------------------------------------------
  67. DATA     SEGMENT AT 40H
  68. RS232_BASE       DW 4 DUP(?)      ; ADDRESSES OF RS232 ADAPTERS
  69. PRINTER_BASE     DW 4 DUP(?)      ; ADDRESSES OF PRINTERS
  70. EQUIP_FLAG       DW ?             ; INSTALLED HARDWARE
  71. MFG_TST          DB ?             ; INITIALIZATION FLAG
  72. MEMORY_SIZE      DW ?             ; MEMORY SIZE IN K BYTES
  73. MFG_ERR_FLAG     DB ?             ; SCRATCH PAD FOR MANUFACTURING
  74.                  DB ?             ; ERROR CODES
  75. ;-----------------------------------------------------------------------
  76. ;             KEYBOARD DATA AREAS
  77. ;-----------------------------------------------------------------------
  78. KB_FLAG          DB ?             ; KEYBOARD STATUS
  79. KB_FLAG_1        DB ?             ; SECOND BYTE OF KEYBOARD STATUS
  80. ALT_INPUT        DB ?             ; STORAGE FOR ALTERNATE KEYPAD ENTRY
  81. ;
  82. ; ----- SHIFT FLAG EQUATES WITHIN KB_FLAG
  83. ;
  84. INS_STATE        EQU 80H          ; INSERT SATE IS ACTIVE
  85. CAPS_STATE       EQU 40H          ; CAPS LOCK STATE HAS BEEN TOGGLED
  86. NUM_STATE        EQU 20H          ; NUM LOCK STATE HAS BEEN TOGGLED
  87. SCROLL_STATE     EQU 10H          ; SCROLL LOCK STATE HAS BEEN TOGGLED
  88. ALT_SHIFT        EQU 08H          ; ALTERNATE SHIFT KEY DEPRESSED
  89. CTL_SHIFT        EQU 04H          ; CONTROL SHIFT KEY DEPRESSED
  90. LEFT_SHIFT       EQU 02H          ; LEFT SHIFT KEY DEPRESSED
  91. RIGHT_SHIFT      EQU 01H          ; RIGHT SHIFT KEY DEPRESSED
  92.                  ORG 001AH        ; ORG TO KEYBOARD BUFFER
  93. BUFFER_HEAD      DW  ?            ; POINTER TO HEAD OF KEYBOARD BUFFER
  94. BUFFER_TAIL      DW  ?            ; POINTER TO TAIL OF KEYBOARD BUFFER
  95. KB_BUFFER        DW  16 DUP(?)    ; ROOM FOR 15 ENTRIES
  96.                  ORG 0049H        ; ORG TO START OF DISPLAY DATA
  97. ;-----------------------------------------------------------------------
  98. ;             VIDEO DISPLAY DATA AREA
  99. ;-----------------------------------------------------------------------
  100. CRT_MODE         DB  ?            ; CURRENT CRT MODE
  101. CRT_COLS         DW  ?            ; NUMBER OF COLS ON SCREEN
  102. CRT_LEN          DW  ?            ; LENGTH OF REGEN IN BYTES
  103. CRT_START        DW  ?            ; STARTING ADDRESS IN REGEN BUFFER
  104. CURSOR_POSN      DW  8 DUP(?)     ; CURSOR FOR EACH OF UP TO 8 PAGES
  105. CURSOR_MODE      DW  ?            ; CURRENT CURSOR MODE SETTING
  106. ACTIVE_PAGE      DB  ?            ; CURRENT PAGE BEING DISPLAYED
  107. ADDR_6845        DW  ?            ; BASE ADDRESS FOR ACTIVE DISPLAY CARD
  108. CRT_MODE_SET     DB  ?            ; CURRENT SETTING OF THE 3X8 REGISTER
  109. CRT_PALETTE      DB  ?            ; CURRENT PALETTE SETTING COLOR CARD
  110. ;-----------------------------------------------------------------------
  111. ;             POST AND BIOS WORK DATA AREA
  112. ;-----------------------------------------------------------------------
  113. IO_ROM_INIT      DW  ?            ; PNTR TO OPTIONAL I/O ROM INIT ROUTINE
  114. IO_ROM_SEG       DW  ?            ; POINTER TO I/O ROM SEGMENT
  115. INTR_FLAG        DB  ?            ; FLAG TO INDICATE AN INTERRUPT HAPPENE
  116. ;-----------------------------------------------------------------------
  117. ;             TIMER DATA AREA
  118. ;-----------------------------------------------------------------------
  119. TIMER_LOW        DW  ?            ; LOW WORD OF TIMER COUNT
  120. TIMER_HIGH       DW  ?            ; HIGH WORD OF TIMER COUNT
  121. TIMER_OFL        DB  ?            ; TIMER HAS ROLLED OVER SINCE READ
  122. ;-----------------------------------------------------------------------
  123. ;             SYSTEM DATA AREA
  124. ;-----------------------------------------------------------------------
  125. BIOS_BREAK       DB  ?            ; BIT 7=1 IF BREAK KEY DEPRESSED
  126. RESET_FLAG       DW  ?            ; WORD=1234H IF KEYBOARD RESET
  127. ;-----------------------------------------------------------------------
  128. ;             FIXED DISK DATA AREA
  129. ;-----------------------------------------------------------------------
  130. DISK_STATUS1     DB  ?            ; FIXED DISK STATUS
  131. HF_NUM           DB  ?            ; COUNT OF FIXED DISKS
  132. CONTROL_BYTE     DB  ?            ; HEAD CONTROL BYTE
  133. PORT_OFF         DB  ?            ;  RESERVED (PORT OFFSET)
  134. ;
  135.                  ORG 0080H        ; ORG TO START OF ADDITIONAL KB DATA
  136. BUFFER_START     DW  ?
  137. BUFFER_END       DW  ?
  138. DATA     ENDS
  139. ;
  140.          PAGE
  141. ED_CODE  SEGMENT PARA PUBLIC 'CODE'  ; CODE SEGMENT
  142. EDDT_ROM PROC  FAR                ; BEGINNING OF CODE SEGMENT
  143.          ASSUME CS:ED_CODE        ; INFORM ASSEMBLER
  144.          DB    055H,0AAH          ; ROM MARKER
  145.          DB    16                 ; NUMBER OF 512 BYTE BLOCKS
  146. ED_ENTRY:                         ; ENTRY POINT FOR EDDT
  147.          JMP   ED_GO              ; JUMP TO CODE START
  148.          DB    'EDDT Version 4.00'
  149.          DB    'Copyright 1987,1988 Don Gentry'
  150.          DB    '  '
  151.          EVEN
  152.          DB    'CCooppyyrriigghhtt  11998877,,11998888'
  153.          DB    '  DDoonn  GGeennttrryy    '
  154.          DB    'REVISION DATE 03/12/88'
  155. ED_MSG0  EQU   $
  156.          DFLD  02,32,15,'EDDT Version 4.00'
  157. ED_MSG1  EQU   $
  158.          DFLD  03,26,15,'Copyright 1987,1988 Don Gentry'
  159. ED_MSG2  EQU   $
  160.          DFLD  04,25,15,'Extended Drive Description Tables'
  161. ED_NOEFD EQU   $
  162.          DFLD  06,24,15,'EDDT_01 - No Fixed Drives defined'
  163. ED_FD0E1 EQU   $
  164.          DFLD  06,24,15,'EDDT_02 - Invalid type defined for drive 0'
  165. ED_FD1E1 EQU   $
  166.          DFLD  07,24,15,'EDDT_02 - Invalid type defined for drive 1'
  167. ED_FD0E2 EQU   $
  168.          DFLD  06,24,15,'EDDT_05 - Drive 0 failed diagnostics RC='
  169. ED_FD1E2 EQU   $
  170.          DFLD  07,24,15,'EDDT_05 - Drive 1 failed diagnostics RC='
  171. ED_CME01 EQU   $
  172.          DFLD  08,24,15,'EDDT_03 - CMOS ERROR bad checksum or battery'
  173. ED_CTLRE EQU   $
  174.          DFLD  06,24,15,'EDDT_04 - Controller failed internal tests'    '
  175. ED_DPRM1 EQU   $
  176.          DFLD  10,30,07,'FIXED DRIVE PARAMETERS'
  177. ED_DPRM2 EQU   $
  178.          DFLD  12,44,07,'Drive 0     Drive 1'
  179. ED_DPRM3 EQU $
  180.          DFLD  13,18,07,'Cylinders                  0000D       0000D'
  181. ED_DPRM4 EQU $
  182.          DFLD  14,18,07,'Heads                        00D         00D'
  183. ED_DPRM5 EQU $
  184.          DFLD  15,18,07,'Write Pre-Compensation     0000H       0000H'
  185. ED_DPRM6 EQU $
  186.          DFLD  16,18,07,'Control Byte                 00H         00H'
  187. ED_DPRM7 EQU $
  188.          DFLD  17,18,07,'Landing Zone               0000D       0000D'
  189. ED_DPRM8 EQU $
  190.          DFLD  18,18,07,'Sectors/Track                00D         00D'
  191. ED_DPRM9 EQU $
  192.          DFLD  20,00,07
  193. ED_DIAG0 EQU $
  194.          DFLD  20,14,07,'Performing Diagnostics on Drive _'
  195. ED_DIAG1 EQU $
  196.          DFLD  22,14,07,'Function __                      Status 00H'
  197. ED_DIAG2 EQU $
  198.          DFLD  22,23,07,'09H  Set Drive Parms    Status 00H'
  199. ED_DIAG3 EQU $
  200.          DFLD  22,23,07,'00H  Drive Reset        Status 00H'
  201. ED_DIAG4 EQU $
  202.          DFLD  22,23,07,'10H  Test Drive Ready   Status 00H'
  203. ED_DIAG5 EQU $
  204.          DFLD  22,23,07,'11H  Recalibrate        Status 00H '
  205. ED_DIAG6 EQU $
  206.          DFLD  22,23,07,'04H  Verify Track 0     Status 00H'
  207. ED_DIAG7 EQU $
  208.          DFLD  22,23,07,'04H  Verify Last Track  Status 00H '
  209. ED_DIAG8 EQU $
  210.          DFLD  22,57,07
  211. ED_DIAG9 EQU $
  212.          DFLD  22,23,07,'08H  Return Drive Parms Status 00H'
  213. ED_PRESS EQU $
  214.          DFLD  23,28,15,'Press Any Key To Continue'
  215. ED_PRESC EQU $
  216.          DFLD  23,28,15,'                         '
  217. ED_CSR24 EQU $
  218.          DFLD  24,08,07
  219.          PAGE
  220. ;
  221. ; -----  EXTENDED DRIVE DESCRIPTOR TABLES
  222. ;
  223.          INCLUDE EDDTBL40.ASM     ; COPY OUR DRIVE TABLE
  224.          PAGE
  225. ;
  226. ED_CMOS  EQU   $                  ; CMOS I/O AREA
  227. ED_FDTYP DB    0                  ; FLOPPY DISK DRIVES
  228.          DB    0                  ; RESERVED
  229. ED_HDTYP DB    0                  ; DRIVE TYPES 1-14
  230.          DB    0                  ; RESERVED
  231. ED_EQ    DB    0                  ; EQUIPMENT BYTE
  232. ED_MBML  DB    0                  ; MOTHER BOARD MEMORY LOW BYTE
  233. ED_MBMH  DB    0                  ; MOTHER BOARD MEMORY HI BYTE
  234. ED_EXML  DB    0                  ; EXPANSION MEMORY LOW BYTE
  235. ED_EXMH  DB    0                  ; EXPANSION MEMORY HI BYTE
  236. ED_HD0E  DB    0                  ; HARD DRIVE 0 EXTENDED TYPE
  237. ED_HD1E  DB    0                  ; HARD DRIVE 1 EXTENDED TYPE
  238.          DB    19 DUP(0)          ; RESERVED
  239. ED_CHKSL DB    0                  ; CHECKSUM BYTE LOW
  240. ED_CHKSH DB    0                  ; CHECKSUM BYTE HI
  241.          PAGE
  242. ;   __________________________________________________________________
  243. ;  :                                                                  :
  244. ;  :     BEGIN THE LOGIC SECTION OF ETTDV300                          :
  245. ;  :__________________________________________________________________:
  246. ;
  247. ED_GO:                            ; START OF LOGIC
  248. ;
  249. ; -----  SAVE DOS' REGISTERS TO STACK
  250. ;
  251.          PUSHF                    ; SAVE FLAGS
  252.          PUSH  DS                 ; SAVE DS REGISTER
  253.          PUSH  ES                 ; SAVE ES REGISTER
  254.          PUSHA                    ; SAVE REMAINING REGS
  255. ;
  256. ; -----  INITIALIZE OUR SEGMENT REGISTERS
  257. ;
  258.          MOV   AX,00H             ; MOV ZERO TO AX
  259.          MOV   ES,AX              ; ADDRESS PAGE 0 WITH ES
  260.          ASSUME ES:PAGE_0         ; INFORM ASSEMBLER
  261.          MOV   AX,40H             ; GET ADDRESS OF BIOS DATA SEGMENT
  262.          MOV   DS,AX              ; ADDRESS BIOS DATA SEGMENT WITH DS
  263.          ASSUME DS:DATA           ; INFORM ASSEMBLER
  264.          CLD                      ; CLEAR DIRECTION FLAG
  265.          MOV   HF_NUM,00H         ; CLEAR NUMBER OF DRIVES
  266. ;
  267. ; -----  CLEAR THE SCREEN
  268. ;
  269.          MOV   AH,05H             ; SELECT ACTIVE VIDEO PAGE
  270.          MOV   AL,00H             ; SELECT PAGE 0
  271.          INT   10H                ; VIDEO RUPT TO BIOS
  272. ;
  273.          CLS                      ; CLEAR THE SCREEN
  274. ;
  275. ; -----  WRITE THE COPYRIGHT MESSAGE
  276. ;
  277.          WCS   ED_MSG0,,CS        ; WRITE MESSAGE
  278.          WCS   ED_MSG1,,CS        ; WRITE MESSAGE
  279.          WCS   ED_MSG2,,CS        ; WRITE MESSAGE
  280. ED_HDGO:
  281. ;
  282. ; -----  INITIALIZE DISK POINTER VECTORS
  283. ;
  284.          CLI                      ; RUPTS OFF
  285.          MOV   ED_D0SEG,CS        ; SEGMENT OF TABLE
  286.          MOV   ED_D0OFF,OFFSET ED_TZERO ; DUMMY ENTRY
  287.          MOV   ED_D1SEG,CS        ; SEGMENT OF TABLE
  288.          MOV   ED_D1OFF,OFFSET ED_TZERO ; DUMMY ENTRY
  289.          MOV   PORT_OFF,00H       ; ZERO CONTROLLER PORT ADDRESS
  290.          MOV   DISK_STATUS1,00H   ; CLEAR DRIVE STATUS BYTE
  291.          MOV   CONTROL_BYTE,00H   ; CLEAR THE CONTROL BYTE
  292. ;
  293.          STI                      ; RUPTS ON
  294.          CMOS  READ,0EH           ; READ CMOS DIAGNOSTIC BYTE
  295. ;
  296. ;        CHECK THE CMOS DIAGNOSTIC STATUS BYTE FOR THE FOLLOWING
  297. ;        11000000
  298. ;        ||
  299. ;        |`-----------> CMOS CHECKSUM IS INVALID
  300. ;        `--------------> CMOS BATTERY HAS FAILED
  301. ;
  302.          TEST  AL,11000000B       ; IS CMOS GOOD ?
  303.          JZ    ED_CM01            ; ...YES - CONTINUE
  304.          WCS   ED_CME01,,CS       ; WRITE ERROR MESSAGE
  305. ;
  306.          JMP   ED_EXIT
  307. ED_CM01:
  308. ;
  309. ;        SET THE CMOS DIAGNOSTIC STATUS BYTE FOR THE FOLLOWING
  310. ;        00000000
  311. ;            |
  312. ;            `----> 0 = DRIVE C WORKING - OK TO BOOT FROM C
  313. ;
  314.          AND   AL,11110111B       ; SET BOOT FROM C OK BIT OFF
  315.          MOV   AH,AL              ; SAVE THE DATA IN AL IN AH
  316.          CMOS  WRITE,0EH,AH       ; WRITE TO CMOS
  317.          PAGE
  318. ;
  319. ; -----  READ THE CMOS & CHECK FOR DRIVE 0
  320. ;
  321.          CMOS  READ,019H          ; READ EDDT FIXED DISK TYPE BYTE
  322. ;
  323.          CMP   AL,00H             ; EDDT TYPE DEFINED ?
  324.          JNE   ED_FD001           ; ...YES - HANDLE DRIVE 0
  325.          WCS   ED_NOEFD,,CS       ; WRITE MESSAGE & EXIT
  326. ;
  327.          JMP   ED_EXIT            ; EXIT TO THE BIOS
  328. ;
  329. ; -----  SETUP DRIVE 0
  330. ;
  331. ED_FD001:
  332.          CMP   AL,ED_MAXE-1       ; IS TYPE > MAX ?
  333.          JNA   ED_FD0OK           ; ...NO - OK TO CONTINUE
  334. ED_FD0ER:
  335.          WCS   ED_FD0E1,,CS       ; WRITE ERROR MESSAGE FOR DRIVE 0
  336.          JMP   ED_FD100           ; GO TRY DRIVE 1
  337. ;
  338. ED_FD0OK:
  339.          MOV   AH,00H             ; CLEAR AH
  340.          SUB   AX,1               ; SUBTRACT BASE ENTRY NUMBER
  341.          SHL   AX,4               ; AX * 10H (LENGTH OF AN ENTRY)
  342.          LEA   DX,ED_TABLE        ; GET BASE ADDRESS OF THE TABLE
  343.          ADD   DX,AX              ; GET SEGMENT OFFSET OF ENTRY
  344. ;
  345. ; -----  SETUP INTERRUPT 41 FOR DRIVE 0
  346. ;
  347.          CLI                      ; RUPTS OFF
  348.          MOV   ED_D0OFF,DX        ; SET THE OFFSET
  349.          MOV   ED_D0SEG,CS        ; SET THE SEGMENT
  350.          STI                      ; ENABLE RUPTS
  351.          INC   HF_NUM             ; ADD TO COUNT OF HARD DISKS
  352. ;
  353. ; -----  READ THE CMOS & CHECK FOR DRIVE 1
  354. ;
  355. ED_FD100:
  356.          CMOS  READ,01AH          ; READ EDDT FIXED DISK TYPE BYTE
  357. ;
  358.          CMP   AL,00H             ; EDDT TYPE DEFINED ?
  359.          JNE   ED_FD101           ; ...YES - HANDLE DRIVE 1
  360. ;
  361.          JMP   ED_EXIT            ; EXIT TO THE DIAGS
  362. ;
  363. ; -----  SETUP DRIVE 0
  364. ;
  365. ED_FD101:
  366.          CMP   AL,ED_MAXE-1       ; IS TYPE > MAX ?
  367.          JNA   ED_FD1OK           ; ...NO - OK TO CONTINUE
  368. ED_FD1ER:
  369.          WCS   ED_FD1E1,,CS       ; WRITE ERROR MESSAGE FOR DRIVE 1
  370.          JMP   ED_EXIT            ; GO EXIT
  371. ;
  372. ED_FD1OK:
  373.          MOV   AH,00H             ; CLEAR AH
  374.          SUB   AX,1               ; SUBTRACT BASE ENTRY NUMBER
  375.          SHL   AX,4               ; AX * 10H (LENGTH OF AN ENTRY)
  376.          LEA   DX,ED_TABLE        ; GET BASE ADDRESS OF THE TABLE
  377.          ADD   DX,AX              ; GET SEGMENT OFFSET OF ENTRY
  378. ;
  379. ; -----  SETUP INTERRUPT 46 FOR DRIVE 1
  380. ;
  381.          CLI                      ; RUPTS OFF
  382.          MOV   ED_D1OFF,DX        ; SET THE OFFSET
  383.          MOV   ED_D1SEG,CS        ; SET THE SEGMENT
  384.          STI                      ; ENABLE RUPTS
  385.          INC   HF_NUM             ; ADD TO COUNT OF HARD DISKS
  386.          PAGE
  387. ED_EXIT:
  388.          CMP   HF_NUM,0           ; ANY DRIVES FOUND ?
  389.          JNE   ED_CDIAG           ; ...YES - CONTROLLER DIAG
  390.          JMP   ED_DONE            ; ...NO - EXIT NOW
  391. ED_CDIAG:
  392. ;
  393. ; -----  PRINT DRIVE 0/DRIVE 1 PARMS ON CRT
  394. ;
  395.          CALL  ED_LDP             ; CALL LIST DRIVE PARMS
  396.          CALL  ED_KINIT           ; INITIALIZE THE KEYBOARD
  397. ;
  398. ; -----  EXECUTE CONTROLLER DIAGS                8888888
  399. ;
  400.          MOV   AH,14H             ; DIAG FUNCTION
  401.          MOV   DL,80H             ; GIVE HIM A DRIVE NUMBER
  402.          INT   13H                ; RUPT TO BIOS
  403.          JNC   ED_CTLGD           ; NO ERROR GO ON
  404.          WCS   ED_CTLRE,,CS       ; WRITE ERROR MESSAGE
  405. ED_CTLGD:
  406.          WCS   ED_DIAG0,,CS       ; WRITE MESSAGE
  407.          WCS   ED_DIAG1,,CS       ; WRITE MESSAGE
  408.          MOV   AH,02H             ; SET CURSOR POSITION
  409.          MOV   BH,00H             ; SELECT PAGE
  410.          MOV   DX,142EH           ; CURSOR POSITION
  411.          INT   10H                ; VIDEO RUPT TO BIOS
  412. ;
  413.          MOV   AH,0AH             ; WRITE CHARACTER
  414.          MOV   BH,00H             ; VIDEO PAGE
  415.          MOV   CX,1               ; NUMBER OF CHARS
  416.          MOV   AL,'0'             ; CHARACTER TO WRITE
  417.          INT   10H                ; VIDEO RUPT TO BIOS
  418. ;
  419.          MOV   DL,80H             ; GET DRIVE 0 ADDRESS
  420.          CALL  ED_INITD           ; INIT DRIVE 0
  421.          CMP   HF_NUM,2           ; 2 DRIVES FOUND ?
  422.          JNE   ED_1DRIV           ; ...NO - SKIP DRIVE 2
  423.          MOV   AH,02H             ; SET CURSOR POSITION
  424.          MOV   BH,00H             ; SELECT PAGE
  425.          MOV   DX,142EH           ; CURSOR POSITION
  426.          INT   10H                ; VIDEO RUPT TO BIOS
  427. ;
  428.          MOV   AH,0AH             ; WRITE CHARACTER
  429.          MOV   BH,00H             ; VIDEO PAGE
  430.          MOV   CX,1               ; NUMBER OF CHARS
  431.          MOV   AL,'1'             ; CHARACTER TO WRITE
  432.          INT   10H                ; VIDEO RUPT TO BIOS
  433. ;
  434.          MOV   DL,81H             ; GET DRIVE 1 ADDRESS
  435.          CALL  ED_INITD           ; INIT DRIVE 1
  436. ED_1DRIV:
  437. ED_DONE:
  438.          CSRP  ED_CSR24           ; POSITION CURSOR ON EXIT
  439. ;
  440. ; -----  RESTORE DOS' REGISTERS FROM THE STACK
  441. ;
  442.          POPA                     ; GET REGS FROM STACK
  443.          POP   ES                 ; RECOVER ES
  444.          POP   DS                 ; RECOVER DS
  445.          POPF                     ; RECOVER FLAGS
  446. ;
  447. ; -----  RETURN TO DOS & CONTINUE INITIALIZATION
  448. ;
  449.          RET                      ; RETURN
  450.          PAGE
  451. ;
  452. ; -----  LIST THE DRIVE PARAMETERS ON THE SCREEN
  453. ;
  454. ED_LDP   PROC  NEAR               ; DEFINE PROCEDURE
  455. ;
  456.          WCS   ED_DPRM1,,CS       ; WRITE DISK PARM TABLE MESSAGE
  457. ;
  458.          WCS   ED_DPRM2,,CS       ; WRITE DISK PARM TABLE MESSAGE
  459. ;
  460.          WCS   ED_DPRM3,,CS       ; WRITE DISK PARM TABLE MESSAGE
  461. ;
  462.          WCS   ED_DPRM4,,CS       ; WRITE DISK PARM TABLE MESSAGE
  463. ;
  464.          WCS   ED_DPRM5,,CS       ; WRITE DISK PARM TABLE MESSAGE
  465. ;
  466.          WCS   ED_DPRM6,,CS       ; WRITE DISK PARM TABLE MESSAGE
  467. ;
  468.          WCS   ED_DPRM7,,CS       ; WRITE DISK PARM TABLE MESSAGE
  469. ;
  470.          WCS   ED_DPRM8,,CS       ; WRITE DISK PARM TABLE MESSAGE
  471. ;
  472.          CSRP  ED_DPRM9           ; POSITION CURSOR
  473.          PAGE
  474. ;
  475. ; -----  WRITE PARMS FOR DRIVE 0 --------------------------------
  476. ;
  477. ; -----  GET THE NUMBER OF CYLINDERS
  478. ;
  479.          MOV   DI,ED_D0OFF        ; GET POINTER TO DRIVE TABLE
  480.          MOV   AX,WORD PTR CS:[DI+00] ; GET NUMBER OF CYLS
  481. ;
  482. ; -----  CONVERT NUMBER OF CYLS TO DECIMAL ASCII & PRINT
  483. ;
  484.          CALL  ED_CVDA            ; CONVERT TO ASCII
  485. ;
  486.          MOV   AH,0FH             ; REQUEST CURRENT VIDEO MODE
  487.          INT   10H                ; RUPT TO BIOS
  488. ;
  489.          LEA   BP,ED_WORKA        ; ES:BP POINT TO WORK AREA
  490.          MOV   DX,0D2DH           ; SET ROW/COL
  491.          MOV   CX,4               ; LENGTH OF STRING
  492.          MOV   BL,07H             ; WRITE ATTRIBUTE
  493.          MOV   AX,1300H           ; WRITE CHARACTER STRING REQUEST
  494.          INT   10H                ; RUPT TO BIOS
  495. ;
  496. ; -----  GET THE NUMBER OF HEADS
  497. ;
  498.          MOV   AL,BYTE PTR CS:[DI+02] ; GET NUMBER OF HEADS
  499.          MOV   AH,0               ; ZERO AH
  500. ;
  501. ; -----  CONVERT NUMBER OF HEADS TO DECIMAL ASCII & PRINT
  502. ;
  503.          CALL  ED_CVDA            ; CONVERT TO ASCII
  504. ;
  505.          MOV   AH,0FH             ; REQUEST CURRENT VIDEO MODE
  506.          INT   10H                ; RUPT TO BIOS
  507. ;
  508.          LEA   BP,ED_WORKA+2      ; ES:BP POINT TO WORK AREA
  509.          MOV   DX,0E2FH           ; SET ROW/COL
  510.          MOV   CX,2               ; LENGTH OF STRING
  511.          MOV   BL,07H             ; WRITE ATTRIBUTE
  512.          MOV   AX,1300H           ; WRITE CHARACTER STRING REQUEST
  513.          INT   10H                ; RUPT TO BIOS
  514. ;
  515. ; -----  GET THE WRITE PRE-COMP CYL
  516. ;
  517.          MOV   AX,WORD PTR CS:[DI+05] ; GET PRE-COMP CYLS
  518. ;
  519. ; -----  CONVERT WRITE PRE-COMP TO HEX ASCII & PRINT
  520. ;
  521.          CALL  ED_CVHA            ; CONVERT TO ASCII
  522. ;
  523.          MOV   AH,0FH             ; REQUEST CURRENT VIDEO MODE
  524.          INT   10H                ; RUPT TO BIOS
  525. ;
  526.          LEA   BP,ED_WORKA        ; ES:BP POINT TO WORK AREA
  527.          MOV   DX,0F2DH           ; SET ROW/COL
  528.          MOV   CX,4               ; LENGTH OF STRING
  529.          MOV   BL,07H             ; WRITE ATTRIBUTE
  530.          MOV   AX,1300H           ; WRITE CHARACTER STRING REQUEST
  531.          INT   10H                ; RUPT TO BIOS
  532. ;
  533. ; -----  GET THE CONTROL BYTE
  534. ;
  535.          MOV   AX,WORD PTR CS:[DI+08] ; GET CONTROL BYTE
  536. ;
  537. ; -----  CONVERT CONTROL BYTE TO HEX ASCII & PRINT
  538. ;
  539.          CALL  ED_CVHA            ; CONVERT TO ASCII
  540. ;
  541.          MOV   AH,0FH             ; REQUEST CURRENT VIDEO MODE
  542.          INT   10H                ; RUPT TO BIOS
  543. ;
  544.          LEA   BP,ED_WORKA+2      ; ES:BP POINT TO WORK AREA
  545.          MOV   DX,102FH           ; SET ROW/COL
  546.          MOV   CX,2               ; LENGTH OF STRING
  547.          MOV   BL,07H             ; WRITE ATTRIBUTE
  548.          MOV   AX,1300H           ; WRITE CHARACTER STRING REQUEST
  549.          INT   10H                ; RUPT TO BIOS
  550. ;
  551. ; -----  GET THE LANDING ZONE
  552. ;
  553.          MOV   AX,WORD PTR CS:[DI+12] ; GET LANDING ZONE
  554. ;
  555. ; -----  CONVERT LANDING ZONE TO DECIMAL ASCII & PRINT
  556. ;
  557.          CALL  ED_CVDA            ; CONVERT TO ASCII
  558. ;
  559.          MOV   AH,0FH             ; REQUEST CURRENT VIDEO MODE
  560.          INT   10H                ; RUPT TO BIOS
  561. ;
  562.          LEA   BP,ED_WORKA        ; ES:BP POINT TO WORK AREA
  563.          MOV   DX,112DH           ; SET ROW/COL
  564.          MOV   CX,4               ; LENGTH OF STRING
  565.          MOV   BL,07H             ; WRITE ATTRIBUTE
  566.          MOV   AX,1300H           ; WRITE CHARACTER STRING REQUEST
  567.          INT   10H                ; RUPT TO BIOS
  568. ;
  569. ; -----  GET SECTORS/TRACK
  570. ;
  571.          MOV   AL,BYTE PTR CS:[DI+14] ; GET SECTORS/TRACK
  572.          MOV   AH,0               ; CLEAR AH
  573. ;
  574. ; -----  CONVERT SECTORS/TRACK TO DECIMAL ASCII & PRINT
  575. ;
  576.          CALL  ED_CVDA            ; CONVERT TO ASCII
  577. ;
  578.          MOV   AH,0FH             ; REQUEST CURRENT VIDEO MODE
  579.          INT   10H                ; RUPT TO BIOS
  580. ;
  581.          LEA   BP,ED_WORKA+2      ; ES:BP POINT TO WORK AREA
  582.          MOV   DX,122FH           ; SET ROW/COL
  583.          MOV   CX,2               ; LENGTH OF STRING
  584.          MOV   BL,07H             ; WRITE ATTRIBUTE
  585.          MOV   AX,1300H           ; WRITE CHARACTER STRING REQUEST
  586.          INT   10H                ; RUPT TO BIOS
  587.          PAGE
  588. ;
  589. ; -----  WRITE PARMS FOR DRIVE 1 --------------------------------
  590. ;
  591. ; -----  GET THE NUMBER OF CYLINDERS
  592. ;
  593.          MOV   DI,ED_D1OFF        ; GET POINTER TO DRIVE TABLE
  594.          MOV   AX,WORD PTR CS:[DI+00] ; GET NUMBER OF CYLS
  595. ;
  596. ; -----  CONVERT NUMBER OF CYLS TO DECIMAL ASCII & PRINT
  597. ;
  598.          CALL  ED_CVDA            ; CONVERT TO ASCII
  599. ;
  600.          MOV   AH,0FH             ; REQUEST CURRENT VIDEO MODE
  601.          INT   10H                ; RUPT TO BIOS
  602. ;
  603.          LEA   BP,ED_WORKA        ; ES:BP POINT TO WORK AREA
  604.          MOV   DX,0D39H           ; SET ROW/COL
  605.          MOV   CX,4               ; LENGTH OF STRING
  606.          MOV   BL,07H             ; WRITE ATTRIBUTE
  607.          MOV   AX,1300H           ; WRITE CHARACTER STRING REQUEST
  608.          INT   10H                ; RUPT TO BIOS
  609. ;
  610. ; -----  GET THE NUMBER OF HEADS
  611. ;
  612.          MOV   AL,BYTE PTR CS:[DI+02] ; GET NUMBER OF HEADS
  613.          MOV   AH,0               ; ZERO AH
  614. ;
  615. ; -----  CONVERT NUMBER OF HEADS TO DECIMAL ASCII & PRINT
  616. ;
  617.          CALL  ED_CVDA            ; CONVERT TO ASCII
  618. ;
  619.          MOV   AH,0FH             ; REQUEST CURRENT VIDEO MODE
  620.          INT   10H                ; RUPT TO BIOS
  621. ;
  622.          LEA   BP,ED_WORKA+2      ; ES:BP POINT TO WORK AREA
  623.          MOV   DX,0E3BH           ; SET ROW/COL
  624.          MOV   CX,2               ; LENGTH OF STRING
  625.          MOV   BL,07H             ; WRITE ATTRIBUTE
  626.          MOV   AX,1300H           ; WRITE CHARACTER STRING REQUEST
  627.          INT   10H                ; RUPT TO BIOS
  628. ;
  629. ; -----  GET THE WRITE PRE-COMP CYL
  630. ;
  631.          MOV   AX,WORD PTR CS:[DI+05] ; GET PRE-COMP CYLS
  632. ;
  633. ; -----  CONVERT WRITE PRE-COMP TO HEX ASCII & PRINT
  634. ;
  635.          CALL  ED_CVHA            ; CONVERT TO ASCII
  636. ;
  637.          MOV   AH,0FH             ; REQUEST CURRENT VIDEO MODE
  638.          INT   10H                ; RUPT TO BIOS
  639. ;
  640.          LEA   BP,ED_WORKA        ; ES:BP POINT TO WORK AREA
  641.          MOV   DX,0F39H           ; SET ROW/COL
  642.          MOV   CX,4               ; LENGTH OF STRING
  643.          MOV   BL,07H             ; WRITE ATTRIBUTE
  644.          MOV   AX,1300H           ; WRITE CHARACTER STRING REQUEST
  645.          INT   10H                ; RUPT TO BIOS
  646. ;
  647. ; -----  GET THE CONTROL BYTE
  648. ;
  649.          MOV   AX,WORD PTR CS:[DI+08] ; GET CONTROL BYTE
  650. ;
  651. ; -----  CONVERT CONTROL BYTE TO HEX ASCII & PRINT
  652. ;
  653.          CALL  ED_CVHA            ; CONVERT TO ASCII
  654. ;
  655.          MOV   AH,0FH             ; REQUEST CURRENT VIDEO MODE
  656.          INT   10H                ; RUPT TO BIOS
  657. ;
  658.          LEA   BP,ED_WORKA+2      ; ES:BP POINT TO WORK AREA
  659.          MOV   DX,103BH           ; SET ROW/COL
  660.          MOV   CX,2               ; LENGTH OF STRING
  661.          MOV   BL,07H             ; WRITE ATTRIBUTE
  662.          MOV   AX,1300H           ; WRITE CHARACTER STRING REQUEST
  663.          INT   10H                ; RUPT TO BIOS
  664. ;
  665. ; -----  GET THE LANDING ZONE
  666. ;
  667.          MOV   AX,WORD PTR CS:[DI+12] ; GET LANDING ZONE
  668. ;
  669. ; -----  CONVERT LANDING ZONE TO DECIMAL ASCII & PRINT
  670. ;
  671.          CALL  ED_CVDA            ; CONVERT TO ASCII
  672. ;
  673.          MOV   AH,0FH             ; REQUEST CURRENT VIDEO MODE
  674.          INT   10H                ; RUPT TO BIOS
  675. ;
  676.          LEA   BP,ED_WORKA        ; ES:BP POINT TO WORK AREA
  677.          MOV   DX,1139H           ; SET ROW/COL
  678.          MOV   CX,4               ; LENGTH OF STRING
  679.          MOV   BL,07H             ; WRITE ATTRIBUTE
  680.          MOV   AX,1300H           ; WRITE CHARACTER STRING REQUEST
  681.          INT   10H                ; RUPT TO BIOS
  682. ;
  683. ; -----  GET SECTORS/TRACK
  684. ;
  685.          MOV   AL,BYTE PTR CS:[DI+14] ; GET SECTORS/TRACK
  686.          MOV   AH,0               ; CLEAR AH
  687. ;
  688. ; -----  CONVERT SECTORS/TRACK TO DECIMAL ASCII & PRINT
  689. ;
  690.          CALL  ED_CVDA            ; CONVERT TO ASCII
  691. ;
  692.          MOV   AH,0FH             ; REQUEST CURRENT VIDEO MODE
  693.          INT   10H                ; RUPT TO BIOS
  694. ;
  695.          LEA   BP,ED_WORKA+2      ; ES:BP POINT TO WORK AREA
  696.          MOV   DX,123BH           ; SET ROW/COL
  697.          MOV   CX,2               ; LENGTH OF STRING
  698.          MOV   BL,07H             ; WRITE ATTRIBUTE
  699.          MOV   AX,1300H           ; WRITE CHARACTER STRING REQUEST
  700.          INT   10H                ; RUPT TO BIOS
  701. ;
  702.          MOV   WORD PTR ED_WORKA+0,0000H ; CLEAR THE
  703.          MOV   WORD PTR ED_WORKA+2,0000H ;  WORK AREA
  704.          RET                      ; RETURN TO CALLER
  705. ED_LDP   ENDP
  706.          PAGE
  707. ED_CVDA  PROC  NEAR               ; CONVERT BINARY IN AX TO ASCII DEC
  708.          PUSH  BX                 ; SAVE BX REG
  709.          PUSH  DX                 ; SAVE DX REG
  710.          PUSH  SI                 ; SAVE SI REG
  711.          MOV   WORD PTR ED_WORKA+0,'  '  ; CLEAR THE
  712.          MOV   WORD PTR ED_WORKA+2,'  '  ;  WORK AREA
  713.          LEA   BX,ED_WORKA+3      ; GET ADDRESS OF WORK AREA
  714.          MOV   SI,10              ; GET DIVISOR, BASE 10
  715. ED_CVDAL:
  716.          SUB   DX,DX              ; CLEAR DIVIDEND
  717.          DIV   SI                 ; DIVIDE BY 10
  718.          ADD   DL,'0'             ; CONVERT TO ASCII
  719.          MOV   ES:[BX],DL         ; SAVE THE CHARACTER
  720.          DEC   BX                 ; BACK UP THROUGH WORK AREA
  721.          CMP   AX,0               ; DONE ?
  722.          JNE   ED_CVDAL           ; ...NO - LOOP
  723. ;
  724.          POP   SI                 ; RESTORE SI REG
  725.          POP   DX                 ; RESTORE DX REG
  726.          POP   BX                 ; RESTORE BX REG
  727.          RET                      ; RETURN TO CALLER
  728. ED_CVDA  ENDP
  729.          PAGE
  730. ED_HEXTT DB    '0123456789ABCDEF'
  731. ED_CVHA  PROC  NEAR               ; CONVERT BINARY IN AX TO ASCII DEC
  732.          PUSH  BX                 ; SAVE BX REG
  733.          PUSH  AX                 ; SAVE A COPY OF AX
  734.          LEA   BX,ED_HEXTT        ; GET ADDRESS OF XLAT TABLE
  735.          AND   AL,0FH             ; ISOLATE LOW ORDER NIBBLE
  736.          XLAT  ED_HEXTT           ; CONVERT TO ASCII
  737.          MOV   ED_WORKA+3,AL      ; PUT IN OUTPUT AREA
  738. ;
  739.          POP   AX                 ; GET AX BACK
  740.          SHR   AL,4               ; ISOLATE HIGH ORDER NIBBLE
  741.          XLAT  ED_HEXTT           ; CONVERT TO ASCII
  742.          MOV   ED_WORKA+2,AL      ; PUT IN OUTPUT AREA
  743. ;
  744.          MOV   AL,AH              ; GET HIGH BYTE
  745.          AND   AL,0FH             ; ISOLATE LOW ORDER NIBBLE
  746.          XLAT  ED_HEXTT           ; CONVERT TO ASCII
  747.          MOV   ED_WORKA+1,AL      ; PUT IN OUTPUT AREA
  748. ;
  749.          MOV   AL,AH              ; GET HIGH BYTE
  750.          SHR   AL,4               ; GET HIGH NI
  751.          XLAT  ED_HEXTT           ; CONVERT TO ASCII
  752.          MOV   ED_WORKA+0,AL      ; PUT IN OUTPUT AREA
  753. ;
  754.          POP   BX                 ; RESTORE AX
  755.          RET                      ; RETURN TO CALLER
  756. ED_CVHA  ENDP
  757. ED_INITD PROC  NEAR
  758. ;
  759. ; -----   PROCEDURE TO INITIALIZE HARD DISKS
  760. ;
  761. ; -----  REGISTER DL HAS THE DRIVE NUMBER (80H=DRIVE 0, 81H=DRIVE 1)
  762. ;
  763. ; -----  PASS THE DRIVE PARAMETERS TO THE CONTROLLER
  764. ;
  765.          WCS   ED_DIAG2,,CS       ; SHOW WHAT TEST ON CRT
  766.          MOV   AH,09H             ; INIT DRIVE CHARACTERISTICS
  767.          INT   13H                ; RUPT TO BIOS
  768.          JNC   ED_IN001           ; CONTINUE IF NO ERROR
  769.          JMP   ED_INITE           ; GO TO ERROR ROUTINE IF FAIL
  770. ED_IN001:
  771.          PAUSE                    ; WAIT A SEC
  772. ; -----  RESET THE DRIVE
  773.          WCS   ED_DIAG3,,CS       ; SHOW WHAT TEST ON CRT
  774.          MOV   AH,00H             ; RESET
  775.          INT   13H                ; RUPT TO BIOS
  776.          JNC   ED_IN002           ; CONTINUE IF NO ERROR
  777.          JMP   ED_INITE           ; GO TO ERROR ROUTINE IF FAIL
  778. ED_IN002:
  779.          PAUSE                    ; WAIT A SEC
  780. ; -----  TEST THE DRIVE FOR READY
  781.          WCS   ED_DIAG4,,CS       ; SHOW WHAT TEST ON CRT
  782.          MOV   AH,10H             ; TEST DRIVE READY
  783.          INT   13H                ; RUPT TO BIOS
  784.          JNC   ED_IN003           ; CONTINUE IF NO ERROR
  785.          JMP   ED_INITE           ; GO TO ERROR ROUTINE IF FAIL
  786. ED_IN003:
  787.          PAUSE                    ; WAIT A SEC
  788. ; -----  RECALIBRATE THE DRIVE
  789.          WCS   ED_DIAG5,,CS       ; SHOW WHAT TEST ON CRT
  790.          MOV   AH,11H             ; RECALIBRATE
  791.          INT   13H                ; RUPT TO BIOS
  792.          JNC   ED_IN004           ; CONTINUE IF NO ERROR
  793.          JMP   ED_INITE           ; GO TO ERROR ROUTINE IF FAIL
  794. ED_IN004:
  795.          PAUSE                    ; WAIT A SEC
  796. ; -----  TEST THE DRIVE FOR READY
  797.          WCS   ED_DIAG4,,CS       ; SHOW WHAT TEST ON CRT
  798.          MOV   AH,10H             ; TEST DRIVE READY
  799.          INT   13H                ; RUPT TO BIOS
  800.          JNC   ED_IN005           ; CONTINUE IF NO ERROR
  801.          JMP   ED_INITE           ; GO TO ERROR ROUTINE IF FAIL
  802. ED_IN005:
  803.          PAUSE                    ; WAIT A SEC
  804. ; -----  VERIFY LOW TRACK
  805.          WCS   ED_DIAG6,,CS       ; SHOW WHAT TEST ON CRT
  806.          MOV   DH,00H             ; HEAD 0
  807.          MOV   CH,00H             ; CYL 0
  808.          MOV   CL,01H             ; SECTOR 1
  809.          MOV   AL,01H             ; READ 1 SECTOR
  810.          MOV   AH,04H             ; VERIFY SECTORS
  811.          INT   13H                ; RUPT TO BIOS
  812.          JNC   ED_IN006           ; CONTINUE IF NO ERROR
  813.          JMP   ED_INITE           ; GO TO ERROR ROUTINE IF FAIL
  814. ED_IN006:
  815.          PAUSE                    ; WAIT A SEC
  816. ; -----  REQUEST THE DRIVE PARMS
  817.          WCS   ED_DIAG9,,CS       ; SHOW WHAT TEST ON CRT
  818.          PUSH  DX                 ; SAVE DX REG
  819.          MOV   AH,08H             ; REQUEST DRIVE PARMS
  820.          INT   13H                ; RUPT TO BIOS
  821.          POP   AX                 ; GET OLD DX VALUE
  822.          MOV   DL,AL              ; RESTORE DRIVE NUMBER
  823.          JNC   ED_IN007           ; CONTINUE IF NO ERROR
  824.          JMP   ED_INITE           ; GO TO ERROR ROUTINE IF FAIL
  825. ED_IN007:
  826.          PAUSE                    ; WAIT A SEC
  827. ; -----  VERIFY HIGH TRACK
  828.          WCS   ED_DIAG7,,CS       ; SHOW WHAT TEST ON CRT
  829.          AND   CL,11000000B       ; TURN OFF SECTOR BITS
  830.          OR    CL,00000001B       ; SELECT SECTOR 1
  831.          MOV   AL,01H             ; 1 SECTOR
  832.          MOV   AH,04H             ; VERIFY SECTOR
  833.          INT   13H                ; RUPT TO BIOS
  834.          JNC   ED_IN008           ; CONTINUE IF NO ERROR
  835.          JMP   ED_INITE           ; GO TO ERROR ROUTINE IF FAIL
  836. ED_IN008:
  837.          PAUSE                    ; WAIT A SEC
  838.          RET                      ; RETURN TO CALLER
  839. ED_INITE:
  840.          CMP   DL,80H             ; DRIVE 0 ?
  841.          JNE   ED_HD0IE           ; ...NO - DRIVE 1
  842.          WCS   ED_FD0E2,,CS       ; WRITE MESSAGE
  843.          JMP   ED_HDIRC           ; GO SHOW RETURN CODE
  844. ED_HD0IE:
  845.          WCS   ED_FD1E2,,CS       ; WRITE MESSAGE
  846. ED_HDIRC:
  847.          CALL  ED_CVHA            ; CONVERT STATUS TO HEX
  848. ;
  849.          CMP   DL,80H             ; DRIVE 0 ?
  850.          JNE   ED_HDI81           ; ... NO DO DRIVE 1
  851.          MOV   BH,00H             ; VIDEO PAGE 0
  852.          LEA   BP,ED_WORKA        ; ES:BP POINT TO WORK AREA
  853.          MOV   CX,2               ; LENGTH OF STRING
  854.          MOV   BL,15              ; WRITE ATTRIBUTE
  855.          MOV   DX,0640H           ; ROW/COL
  856.          MOV   AX,1300H           ; WRITE CHARACTER STRING REQUEST
  857.          INT   10H                ; RUPT TO BIOS
  858.          JMP   ED_HDIST           ; GO SHOW STATUS
  859. ED_HDI81:
  860.          MOV   BH,00H             ; VIDEO PAGE 0
  861.          LEA   BP,ED_WORKA        ; ES:BP POINT TO WORK AREA
  862.          MOV   CX,2               ; LENGTH OF STRING
  863.          MOV   BL,15              ; WRITE ATTRIBUTE
  864.          MOV   DX,0740H           ; ROW/COL
  865.          MOV   AX,1300H           ; WRITE CHARACTER STRING REQUEST
  866.          INT   10H                ; RUPT TO BIOS
  867. ED_HDIST:
  868.          MOV   BH,00H             ; VIDEO PAGE 0
  869.          LEA   BP,ED_WORKA        ; ES:BP POINT TO WORK AREA
  870.          MOV   CX,2               ; LENGTH OF STRING
  871.          MOV   BL,15              ; WRITE ATTRIBUTE
  872.          MOV   DX,1636H           ; ROW/COL
  873.          MOV   AX,1301H           ; WRITE CHARACTER STRING REQUEST
  874.          INT   10H                ; RUPT TO BIOS
  875.          WCS   ED_PRESS,,CS       ; WRITE PRESS KEY MSG
  876.          MOV   BX,4               ; BEEP DURATION
  877.          CALL  ED_BEEP            ; BEEP
  878.          MOV   AH,00H             ; READ KEYBOARD
  879.          INT   16H                ; RUPT TO BIOS
  880.          WCS   ED_PRESC,,CS       ; WRITE PRESS KEY MSG
  881.          CMP   DL,80H             ; DRIVE 0 FAILED ??           03/12/88
  882.          JNE   ED_INXIT           ; ...NO -EXIT                 03/12/88
  883. ;
  884. ; -----  SET THE CMOS ERROR BYTE
  885. ;
  886.          CMOS  READ,0EH           ; READ DIAG BYTE
  887. ;
  888.          OR    AL,08H             ; INDICATE HARD DRIVE FAILED
  889.          MOV   AH,AL              ; SAVE AL'S DATA IN AH
  890.          CMOS  WRITE,0EH,AH       ; WRITE CMOS
  891. ;
  892. ED_INXIT:                         ;                             03/12/88
  893.          RET                      ; RETURN TO CALLER
  894. ED_INITD ENDP                     ; END OF PROC
  895. ED_KINIT PROC  NEAR               ; PROC TO INITIALIZE KEYBD
  896. ;
  897. ; -----  SUBROUTINE TO INITIALIZE THE KEYBOARD HANDLER
  898. ;
  899.          MOV   KB_FLAG,00H        ; RESET KEYBOARD FLAG
  900.          MOV   KB_FLAG_1,00H      ; RESET KEYBOARD FLAG 1
  901.          IN    AL,021H            ; ENABLE KB RUPTS
  902.          AND   AL,0FDH            ; SET RUPT FLAG
  903.          JMP   SHORT $+2          ; I/O DELAY
  904.          OUT   021H,AL            ; FLAG TO PORT
  905. ED_KEXIT:                         ; RETURN TO CALLER
  906.          RET
  907. ED_KINIT ENDP
  908. ;
  909. ; -----  SUBROUTINE TO BEEP THE SPEAKER
  910. ; -----  BX HAS A VALUE FOR DURATION OF THE BEEP
  911. ;
  912. ED_BEEP  PROC  NEAR               ; ROUTINE TO BEEP THE SPEAKER
  913.          CLI                      ; RUPTS OFF
  914.          MOV   AL,0B6H            ; SEL TIM 2,LSB,MSB
  915.          OUT   043H,AL            ; SET TIMER MODE REG
  916.          MOV   AX,0533H           ; DIVISOR FOR 1000HZ
  917.          OUT   042H,AL            ; TIMER CNT - LSB
  918.          MOV   AL,AH              ; TIMER 2 CNT - MSB
  919.          OUT   042H,AL            ; SEND THE BYTE
  920.          IN    AL,061H            ; GET CURRENT PORT VALUE
  921.          MOV   AH,AL              ; SAVE IN AH
  922.          OR    AL,03H             ; SPEAKER ON
  923.          OUT   061H,AL            ; SEND SPKR ON VAL
  924.          SUB   CX,CX              ; ZERO CX REG
  925. ED_BEEP1:                         ; LOOP TO BEEP
  926.          LOOP  ED_BEEP1           ; LOOP 'TIL CX 0
  927.          DEC   BL                 ; COUNT DONE ??
  928.          JNZ   ED_BEEP1           ;
  929.          MOV   AL,AH              ; RESTORE SAVED VALUE
  930.          OUT   061H,AL            ; SEND TO PORT
  931.          RET                      ;
  932. ED_BEEP  ENDP                     ; END OF PROC
  933. EDDT_ROM ENDP                     ; END OF PROC
  934. ED_CODE  ENDS                     ; CODE SEGMENT END
  935.          END
  936.